package com.peng.ivos.user.service.impl;

import com.peng.ivos.base.response.JsonResult;
import com.peng.ivos.base.response.StatusCode;
import com.peng.ivos.user.pojo.dto.UserLoginDTO;
import com.peng.ivos.user.pojo.dto.UserQuery;
import com.peng.ivos.user.pojo.dto.UserRegDTO;
import com.peng.ivos.user.pojo.entity.User;
import com.peng.ivos.user.mapper.UserMapper;
import com.peng.ivos.user.pojo.vo.UserVO;
import com.peng.ivos.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 用户业务层实现类
 *
 * @author： Peng
 * @date： 2024/5/20
 * @version: 1.0
 */
@Service
@Slf4j
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;

    /**
     * 获取用户信息
     *
     * @param userLoginDTO 用户登录DTO
     * @return USERNAME_ERROR-用户名不存在/PASSWORD_ERROR-密码错误/SUCCESS,userVO-成功
     */
    @Override
    public JsonResult getUserByUsername(UserLoginDTO userLoginDTO) {
        log.debug("用户登录，参数：{}", userLoginDTO);
        User user = User.builder().username(userLoginDTO.getUsername())
                .password(userLoginDTO.getPassword())
                .build();
        UserVO userVO = userMapper.getUserByUsername(user);
        if (userVO == null) {
            return JsonResult.error(StatusCode.USERNAME_ERROR, "用户不存在");
        }
        if (!userVO.getPassword().equals(user.getPassword())) {
            return JsonResult.error(StatusCode.PASSWORD_ERROR, "密码错误");
        }
        return JsonResult.success(StatusCode.LOGIN_SUCCESS, "登录成功", userVO);
    }

    @Override
    public JsonResult addUser(UserRegDTO userRegDTO) {
        log.debug("注册用户，参数:{}", userRegDTO);
        if (userRegDTO == null) {
            log.error("注册用户失败，参数为空");
            return JsonResult.error(StatusCode.DATA_UNEXISTS, "用户输入有误");
        }

        User user = User.builder().username(userRegDTO.getUsername())
                .password("123456")
                .email(userRegDTO.getEmail())
                .phone(userRegDTO.getPhone())
                .age(userRegDTO.getAge())
                .gender(userRegDTO.getGender())
                .level(userRegDTO.getLevel())
                .status(userRegDTO.getStatus())
                .parentId(userRegDTO.getParentId())
                .build();
        UserVO userVO = userMapper.getUserByUsername(user);
        if (userVO != null) {
            log.debug("注册用户失败，用户名已存在，正在更新用户信息");
            user.setUpdateTime(new Date());
            user.setId(userVO.getId());
            return userMapper.updateUser(user) > 0 ? JsonResult.success("已更新用户信息") : JsonResult.error("更新用户信息失败");
        } else {
            user.setCreateTime(new Date());
            user.setUpdateTime(new Date());
            return userMapper.insertUser(user) > 0 ? JsonResult.success("注册成功") : JsonResult.error("注册失败");
        }
    }

    @Override
    public List<UserVO> selectUserByExample(UserQuery userQuery) {
        log.debug("查询用户列表，查询条件：{}", userQuery);
        return userMapper.selectUserByExample(userQuery);
    }

    @Override
    public JsonResult resetPassword(Long id) {
        if (id == null){
            log.error("重置密码失败，用户ID不能为空");
            return JsonResult.error(StatusCode.DATA_UNEXISTS, "用户ID不能为空");
        }
        User user = User.builder().id(id).password("123456").build();

        return userMapper.updateUser(user) > 0 ? JsonResult.success("重置密码成功") : JsonResult.error("重置密码失败");
    }

    @Override
    public JsonResult deleteUserById(Long id) {
        if (id == null){
            log.error("删除用户失败，用户ID不能为空");
            return JsonResult.error(StatusCode.DATA_UNEXISTS, "用户ID不能为空");
        }
        return userMapper.deleteUserById(id) > 0 ? JsonResult.success("删除用户成功") : JsonResult.error("删除用户失败");
    }

    @Override
    public JsonResult updateUserStatus(Long id, String status) {
        User user = User.builder().id(id).status(status).build();
        return userMapper.updateUser(user) > 0 ? JsonResult.success("更新用户状态成功") : JsonResult.error("更新用户状态失败");
    }

    @Override
    public JsonResult selectAuditList(Long parentId) {
        ArrayList<UserVO> auditUserVOList = new ArrayList<>();
        UserQuery userQuery = new UserQuery();
        userQuery.setId(parentId);
        UserVO auditUserVO1 = userMapper.selectUserByExample(userQuery).get(0);
        auditUserVOList.add(auditUserVO1);
        //判断有无上上级，并查询
        if (auditUserVO1 != null && auditUserVO1.getParentId() != null){
            userQuery.setId(auditUserVO1.getParentId());
            auditUserVOList.add(userMapper.selectUserByExample(userQuery).get(0));
        }
        if (auditUserVOList.size() != 0){
            return JsonResult.success("上级查询成功",auditUserVOList);
        } else {
            return JsonResult.error("上级查询失败");
        }
    }

}
